//所有网页、微信公众号请求都要先经过这，处理微信公众号的请求校验处理
const User=require('../model/schemas/userschema')
const api=require('../api/api')

function isWchat(ua){  //ua里包含('MicroMessager')则来自微信浏览器，返回true
    return ua.indexOf('MicroMessenger')>-1
}

//1.获取跳转授权页面一定要严格按api属性顺序填写url，且encodeURIComponent(ctx.href)将特殊字符转化
//2. 在公众号后台的“网页获取用户信息接口”填写跳转域名，一般和安全域名一致（不带http和 /路径）
module.exports={
    checkWchat: async (ctx,next) => {
        const ua=ctx.headers['user-agent']  //拿到用户的请求头信息
        const code=ctx.request.query.code;   //获取请求用code（缓存用户信息）

          //如有session.user证明缓存过用户信息,此步骤没双条件则会网页图不显示和每次请求都执行里面跳转地址
        if(!ctx.session.user&&ctx.method==='GET'&&ctx.href.indexOf('show-login')>-1) {
            //公众号请求如果是GET肯定是正在打开网页，因为公众号菜单，语音，文字都经过微信服务器，
            // 然后由它POST请求我们服务器数据给它然后转发给用户的
            if (!code&&isWchat(ua)) {  //如果没有code且来自微信，微信自带浏览器ua有标识
                const redirect_url = encodeURIComponent(ctx.href)
                const scope = 'snsapi_userinfo'
                const state = 'fromWchat'
                let url = api.wchat.getAuthorizeURL(redirect_url, scope, state)

                ctx.redirect(url)  //跳转授权地址，让用户点击授权
            }
        }
        await next()  //不管是否GET，都放行到下一个app.use

    },
    getWchatInfo:async (ctx,next) => {
        //上面重定向到授权页面，用户点击后会让我们服务器GET微信得到这样地址：紧跟用app.use就能接收
        //http://xx.com?code=0217a07e9c194dbf539c45c266b2dcfZ&state=fromWchat
        const {code,state}=ctx.request.query
        if(code&&state==='fromWchat'){  //如有code值和state防伪值是我们设置的fromWchat
            let data=await api.wchat.getToken(code)
            let user=await User.findOne({openid:data.openid})
            if(!user){
                let userInfo=await api.wchat.getUserInfo(data.access_token,data.openid)
                    user=new User({
                    openid:userInfo.openid,
                    unionid:userInfo.unionid,
                    uname:userInfo.nickname,
                    head_img:userInfo.headimgurl,
                    gender:userInfo.sex===1?'男':'女',
                    province:userInfo.province,
                    city:userInfo.city,
                    country:userInfo.country,
                    email:userInfo.unionid||userInfo.openid+'@wx.com'
                })
                await user.save((err) => {
                    if(err)
                })
            }
            ctx.session.user={
                id:user._id,
                uname:user.uname,
                head_img:user.head_img
            };
            ctx.redirect('/')
        }
        await next()
    }
 }